function [] = batchProcessDEMFile(DatDir)
%% DEM文件批处理
% 定义输出文件夹，把所有散布在子文件夹中的文件拷到输出文件夹中
% Date: 3-Jun-2022
% Author: Xiaoyeyimier
% Email: xiaoyeyimier@163.com
% Wechat: xiaoyeyimier
%========================================================================%
% Date: 17-Jun-2022
% 1. modify path
% 2. delete folder after use
%========================================================================%
%% 目标文件解压
% 从http://www.viewfinderpanoramas.org/Coverage%20map%20viewfinderpanoramas_org3.htm
% 下载的文件夹必须以原命名方式'\w{1,2}\d{1,2}'才可以进行处理，
DirTargetExp = '\w{1,2}\d{1,2}';% 1文件夹匹配用的正则表达式
FileOutputName = 'DEMdat';% 2输出文件夹名称
DEMDir = dir(DatDir);% 目录定位当前目录
Names = {DEMDir.name};
AllzipIdx = false(1,length(Names));
for zipIdx = 1:length(Names)
    tempZipName = Names{zipIdx};
    if ~DEMDir(zipIdx).isdir
        if isequal(tempZipName(end-3:end),'.zip') % 判断确实是zip
            AllzipIdx(zipIdx) = ~isempty(regexp(tempZipName,DirTargetExp,'once'));% 正则匹配
        end
    end
end
zipNames = Names(AllzipIdx);
for zipIdx = 1:length(zipNames)
    fprintf('batchProcessDEMFile info : Unziping... %d out of %d\n',...
        zipIdx,length(zipNames));
    tempZipfullpath = fullfile(DatDir,zipNames{zipIdx});
    unzip(tempZipfullpath,DatDir);
    delete(tempZipfullpath);
end
%% 文件夹搜索
DEMDir = dir(DatDir);% 由于解压步骤，可能添加了新的文件夹
DEMDir = DEMDir([DEMDir(:).isdir]);% 获取全部文件夹
IsTargetFlag = false(length(DEMDir),1);% 目标文件夹索引
IsTargetIdx = 1;% 循环索引
while IsTargetIdx<=length(DEMDir)% 寻找当前路径下所有文件
    TempFullDir = DEMDir(IsTargetIdx).name;% 当前文件名
    IsTargetFlag(IsTargetIdx) = ~isempty(regexp(TempFullDir,DirTargetExp,'once'));% 正则匹配
    IsTargetIdx = IsTargetIdx+1;% pointer移动
end
TargetNum = sum(IsTargetFlag);% 获取全部目录个数
if(~TargetNum)
    fprintf('batchProcessDEMFile info : No folders found,Quit!\n');%没有目标文件夹直接退出
    return;
else
    fprintf('batchProcessDEMFile info : %d folders found!\n',TargetNum);%显示找到的文件夹个数
end
%% Copy
%========================================================================%
OutputDir = DatDir;
TargetName = {DEMDir(IsTargetFlag).name};
targetIdx = 1;
ProcessedName = {};
% 有的时候解压缩后文件会放在嵌套的两个文件夹内，比如':/L45/L45/...'这样的情况，对
% 此我们的思路是，不断地找：在L45文件夹下找"[NS]\d+[EW]\d+.hgt"文件，找不到就找
% 'L45';再找不到就报错，如能在找到':/L45/L45'就去在该文件夹下继续此步骤。
totalFileCnt = 0;% 全部文件
while targetIdx <= length(TargetName)
    tempDir = TargetName{targetIdx};% 当前目标
    tempDirFullPath = fullfile(DatDir,tempDir);
    [fullFileName,fileName] = findTaigetFile(DatDir,tempDir);% 找当前文件夹下的目标文件
    filesNum = length(fullFileName);
    if filesNum
        moveFlag = true;
        allDirOfOutDir = dir(OutputDir);% 进入文件夹/子文件夹
        nameIdxOfOutDir = 1;% 输出文件夹下的逐项索引
        filesIdx = 1;
        while filesIdx <= filesNum
            tempFileName = fileName{filesIdx};
            tempFullFileName = fullFileName{filesIdx};
            totalFileCnt = totalFileCnt+1;
            while nameIdxOfOutDir<=length(allDirOfOutDir)% 寻找输出路径下所有文件
                tempDirName = allDirOfOutDir(nameIdxOfOutDir).name;% 当前文件名
                if strcmp(tempDirName,tempFileName)% 先进行文件正则匹配
                    moveFlag = false;
                    break;
                end
                nameIdxOfOutDir = nameIdxOfOutDir+1;% pointer移动
            end
            if moveFlag
                movefile(tempFullFileName,OutputDir); %剪切文件
                fprintf('batchProcessDEMFile : File No.%d found,the fullpath is %s\n',totalFileCnt,tempFullFileName);
            else
                fprintf('batchProcessDEMFile : File No.%d found,but it''s already exist\n',totalFileCnt);
            end
            filesIdx = filesIdx+1;
        end
    end
    targetIdx = targetIdx+1;
    rmdir(tempDirFullPath);
end
end
%=========================================================================%
function [fullFileName,fileName] = findTaigetFile(DatDir,TempDir)
% input :
% TempDir 当前文件夹名
% output :
% fullFileName 找到文件输出文件全路径/没找到文件输出空字符串
% fileName 找到文件输出文件名/没找到文件输出空字符串
fullFileName = {};
fileName     = {};
TargetExp = '[NS]\d+[EW]\d+.hgt';% 1文件匹配用的正则表达式
DirExp = TempDir; % 2.目标文件夹名
TempDir = fullfile(DatDir,TempDir);% 获取绝对路径
TargetCnt = 0;
while true
    allDir = dir(TempDir);% 进入文件夹/子文件夹
    Nameidx = 1;% 逐项索引
    fileFoundFlag = false; % 目标文件在当前路径下?
    DirFoundFlag = false;  % 目标夹文件在当前路径下?
    while Nameidx<=length(allDir)% 寻找当前路径下所有文件
        tempDirName = allDir(Nameidx).name;% 当前文件名
        if ~isempty(regexp(tempDirName,TargetExp,'once'))% 先进行文件正则匹配
            TargetCnt = TargetCnt+1;
            fileName{TargetCnt} = tempDirName;
            fullFileName{TargetCnt} = fullfile(TempDir,tempDirName);% 文件匹配成功直接退出
            fileFoundFlag = true;
        elseif strcmp(tempDirName,DirExp)%文件夹正则匹配
            TempDir = fullfile(TempDir,tempDirName);
            DirFoundFlag = true;
        end
        Nameidx = Nameidx+1;% pointer移动
    end
    if fileFoundFlag
        break;
    elseif ~DirFoundFlag
        break;
    end
end
end